package com.zenithmind.library.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.library.pojo.domain.BookReview;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 图书评价Mapper接口
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
@Mapper
public interface BookReviewMapper extends BaseMapper<BookReview> {

    /**
     * 分页查询图书评价
     * 
     * @param page 分页参数
     * @param bookId 图书ID
     * @param userId 用户ID
     * @param rating 评分
     * @param status 状态
     * @return 分页结果
     */
    IPage<BookReview> selectBookReviewPage(Page<BookReview> page,
                                          @Param("bookId") String bookId,
                                          @Param("userId") String userId,
                                          @Param("rating") Integer rating,
                                          @Param("status") Integer status);

    /**
     * 根据图书ID查询评价
     * 
     * @param bookId 图书ID
     * @return 评价列表
     */
    List<BookReview> selectByBookId(@Param("bookId") String bookId);

    /**
     * 根据用户ID查询评价
     * 
     * @param userId 用户ID
     * @return 评价列表
     */
    List<BookReview> selectByUserId(@Param("userId") String userId);

    /**
     * 检查用户是否已评价该图书
     * 
     * @param userId 用户ID
     * @param bookId 图书ID
     * @return 评价数量
     */
    int countUserBookReview(@Param("userId") String userId, @Param("bookId") String bookId);

    /**
     * 统计图书评价数量
     * 
     * @param bookId 图书ID
     * @return 评价数量
     */
    int countBookReviews(@Param("bookId") String bookId);

    /**
     * 计算图书平均评分
     * 
     * @param bookId 图书ID
     * @return 平均评分
     */
    Double calculateAverageRating(@Param("bookId") String bookId);

    /**
     * 统计各评分数量
     * 
     * @param bookId 图书ID
     * @param rating 评分
     * @return 评分数量
     */
    int countByRating(@Param("bookId") String bookId, @Param("rating") Integer rating);

    /**
     * 更新点赞数
     * 
     * @param id 评价ID
     * @param increment 增量（可为负数）
     * @return 更新行数
     */
    int updateLikeCount(@Param("id") String id, @Param("increment") Integer increment);

    /**
     * 批量更新状态
     * 
     * @param ids 评价ID列表
     * @param status 状态
     * @return 更新行数
     */
    int batchUpdateStatus(@Param("ids") List<String> ids, @Param("status") Integer status);

    /**
     * 获取热门评价
     * 
     * @param bookId 图书ID
     * @param limit 限制数量
     * @return 评价列表
     */
    List<BookReview> selectHotReviews(@Param("bookId") String bookId, @Param("limit") Integer limit);

    /**
     * 获取最新评价
     * 
     * @param bookId 图书ID
     * @param limit 限制数量
     * @return 评价列表
     */
    List<BookReview> selectLatestReviews(@Param("bookId") String bookId, @Param("limit") Integer limit);
}
